//数组的定义和使用
import java.sql.SQLOutput;
import java.util.Arrays;
//java当中专门用来操作数组的
public class Test {
    public static void main0(String[] args) {
        //数组的定义
        int[] array = {1,2,3,4,5};
        int[] array2 = new int[10];//10个0
        int[] array3 = new int[]{1,2,3,4,5,6};//后面有值时不能再规定数组大小
        System.out.println(array);//打印出来的均为“地址”  不是真实的地址 是一个哈希值 可以看作为地址
        System.out.println(array2);//array是一个引用变量：存储“地址”的变量-->引用
        System.out.println(array3);
        int[] array4;
        array4 = new int[10];
        int[] array5;
        array5 =new int[]{1,2,3,4,5,6,7};
        int[] array6;
        // array6={1,2,3,4,5}; 这种是错误的不可以这么赋值

        //数组的打印
        int i = 0;
        for(i = 0; i < array.length; i++){
            System.out.print(array[i]+"");
        }
        System.out.println();

        //for each 循环
        for(int x : array){
            System.out.print(x+"");
        }
        System.out.println();//和上面的区别： for each循环拿不到下标
                             //for each 循环对下表的依赖不强


        //------------------  数组是引用类型  --------------------

        //---认识null
        int[] array8 = null;// array8这个引用不指向任何对象


    }



    // -------------  数组的应用场景  ------------
    //-- 1. 作为函数的参数
    public static void func1(int[] array){
        array = new int[10];//改变了形参array的指向
    }
    public static void func2(int[] array){
        array[0] = 99;

    }
    public static void main1(String[] args) {
       int[] array1 = {1,2,3,4};
       func1(array1);
       for(int i = 0; i<array1.length; i++){
           System.out.print(array1[i]+" ");//1 2 3 4
       }
        System.out.println();

       int[] array2 = {1,2,3,4};
        func2(array2);
        for(int i = 0; i<array2.length; i++){
            System.out.print(array2[i]+" ");//99 2 3 4
        }
    }


    // ----------  数组练习  ----------
    // 1. 数组转字符串
    public static int[] func3(){
        return new int[]{1,2,3,4,5};
    }

    public static void main2(String[] args) {
        int ret[] = func3();
        //将参数的数组转换为字符串输出
//        String s = Arrays.toString(ret); //ctr+鼠标点击
//        System.out.println(s);
        System.out.println(Arrays.toString(ret));

        // 2. 数组拷贝
        int[] arr = {0,8,0,4,2};
        int[] copy = new int[arr.length];
        for(int i = 0; i<arr.length; i++){
            copy[i] = arr[i];
        }
        System.out.println(Arrays.toString(copy));
    }

    public static void main3(String[] args) {
        int[] arr = {0,8,0,4,2};
        int[] copy =Arrays.copyOf(arr,arr.length*2);//*2相当于给数组扩容了
        int[] copy2 =Arrays.copyOfRange(arr,1,4);//[8, 0, 4]
        //int[] copy2 =Arrays.copyOfRange(arr,1,6);  //[8, 0, 4, 2, 0] 超出自动补0
        System.out.println(Arrays.toString(copy));//[0, 8, 0, 4, 2, 0, 0, 0, 0, 0]
        System.out.println(Arrays.toString(copy2));
    }
    //----------  求数组元素的平均值  -------------
    public static double avg(int[] arr){
        int sum = 0;
        for(int x : arr){ //循环的每一次迭代都会自动将arr中的下一个元素赋值给变量x
                          // 然后执行循环体内的代码。当arr中的所有元素都被遍历过后，循环结束。
            sum += x;
        }
        return (double)sum/(double)arr.length;
    }
    public static void main4(String[] args) {
        int[] arr={0,8,0,4,2};
        System.out.println(avg(arr));//2.8
    }

    // ------------- 查找数组中的指定元素  ----------------
    public static void main5(String[] args) {
        int[] arr = {1,2,3,10,5,6,0,8,4};
        int[] arr1 = {1,2,3,10,5,6,0,8,4};
        int[] arr2 = {0,8,0,4,2,1,2,3,4};
        int[] arr3 = new int[10];
        int[] arr4 = new int[10];
        boolean ret = Arrays.equals(arr,arr1);
        System.out.println(ret);//true
        boolean ret1 = Arrays.equals(arr,arr2);
        System.out.println(ret1);//false
        Arrays.fill(arr3,-1);//帮助直接填充数据
        Arrays.fill(arr4,4,8,6);//左闭右开 不包含8

        System.out.println("-----------------");
        System.out.println(Arrays.toString(arr3));//[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
        System.out.println(Arrays.toString(arr4));//[0, 0, 0, 0, 6, 6, 6, 6, 0, 0]

        System.out.println("-----------------");
        System.out.println(find(arr, 10)); // 执行结果 3
        System.out.println(Arrays.binarySearch(arr,5)); // 4 系统自带的 Array.binarySearch() 的二分查找方法
        System.out.println(myBinarySearch(arr,8));// 执行结果 7
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));//[0, 1, 2, 3, 4, 5, 6, 8, 10]


    }
    //  1.  顺序查找
    public static int find(int[] arr, int data) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == data) {
                return i;
            }
        }
        return -1; // 表示没有找到
    }


    //  2.  二分查找
    public static int myBinarySearch(int[] array,int key){
        int left = 0;
        int right = array.length-1;
        while(left<right){
            int mid = (left + right) / 2;
            if(array[mid] < key){
                left = mid +1;
            }else if(array[mid] > key){
                right = mid -1;
            }else{
                return mid;
            }
        }
        return -1;
    }

    // ------------------  冒泡排序  ---------------
    public static void bubbleSort(int[] arr){
        for(int i = 0;i <arr.length; i++){
            boolean flg = false;
            for(int j =1; j<arr.length-i; j++){
                if(arr[j-1] > arr[j]){
                    int ret = arr[j-1];
                    arr[j-1] = arr[j];
                    arr[j] = ret;
                    flg = true;
                }
            }
            if(flg == false){
                break;
            }
        }
    }

    //------------  二维数组  -----------------------
    public static void main(String[] args) {
        //不规则的二维数组
        int[][] array3 = new int[2][];//省略列
        array3[0] = new int[]{1,2,3};
        array3[1] = new int[]{1,2,3,4};
        System.out.println(Arrays.deepToString(array3));//[[1, 2, 3], [1, 2, 3, 4]]
        //二维数组的遍历
        int[][] array1 = {{1,2,3},{4,5,6}};
        for(int i = 0; i < 2; i++){
            for(int j = 0; j < 3; j++){
                System.out.print(array1[i][j]+" ");
            }
            System.out.println();
        }
        //System.out.println(array1[0]);
        //System.out.println(Arrays.toString(array1));
    }
    public static void main6(String[] args) {
        int[][] array1 = {{1,2,3},{4,5,6}};
        int[][] array2 = new int[][]{{1,2,3},{4,5,6,7}};
        int[][] array3 = new int [2][3];

    }


}
